/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 沈明月
 * Date: 2022-11-27
 * Time: 8:16
 */


//类和对象的介绍：

//面向对象和面向过程：
//面向对象：买手机->告诉秘书->秘书去买
//面向过程：买手机：上网查配置->打开购物平台->选参数->选手机->下单->填地址->付款->取快递->使用

//Java是一门纯面向对象的语言（Object Oriented Program,简称OOP）


//如何定义一个类：
//格式：
/*class 类名（类名采用大驼峰的形式定义）{
    属性（成员变量）;
    行为（成员方法）;
}*/

//其他注意事项：
//一般来说，一个Java文件中只写一个类。一个Java文件只能有一个public修饰的类。public修饰的类的类名一般和文件名相同
//main方法所在的类一般是用public修饰（Eclipse会默认在public修饰的类中找main方法）
//不要轻易修改publiC修饰的类的名称，如果要修改，要通过开发工具来改

/*//定义一个人的类：
class Person{
    //属性：
    public String name;
    public  int age;

    //行为：
    public void eat(){
        System.out.println("吃饭！");
    }
    public void sleep(){
        System.out.println("睡觉！");
    }
}
*/

//定义一个person类：
/*
class Person{
    public String name;
    public int age;

    public void eat(){
        System.out.println("吃饭！");
    }
    public void sleep(){
        System.out.println("睡觉！");
    }
}
public class KnowledgeOne {
    public static void main(String[] args) {
        //实例化一个person对象：
        Person person1 = new Person();//通过new来实例化一个对象
        person1.age = 10;//.起的是引用作用
        person1.name = "zhangsan";

//上面这两个语句其实可以类比int和String类型
        */
/*int age = 10;
        String name = "zhangsan";*//*


        System.out.println(person1.name+" "+person1.age);
        person1.eat();
        person1.sleep();
    }
}
*/

/*//定义一个洗衣机的类：
class WashMachine{
    //属性：
    public String brand;//品牌
    public String type;//型号
    public double weight;//重量
    public double length;//长度
    public double width;//宽度
    public double height;//高度
    public String color;//颜色

    //行为：
    public void washClothes(){
        System.out.println("洗衣功能！");
    }
    public void dryClothes(){
        System.out.println("脱水功能！");
    }
    public void setTime(){
        System.out.println("定时功能！");
    }
}*/


/*//定义一个手机的类：
class Phone{
    //属性：
    public String brand;//品牌
    public String type;//型号
    public double weight;//重量
    public double length;//长度
    public double width;//宽度
    public double height;//高度
    public String color;//颜色
    public String screen;//屏幕

    //功能：
    public void movie(){
        System.out.println("看电影！");
    }
    public void call(){
        System.out.println("打电话！");
    }
}*/


//类的实例化：用类类型创建对象的过程称为类的实例化。Java中采用new关键字来配合类名实例化对象
//定义了一个类就相当于在java中创建了一种新的类型（和int、double这种很像）
//以下面这个Person类为例：
//已知通过int类型我们可以定义一个数组：int[] arr = new int[3];
//而作为自定义类型的Person同样具有这种能力：Person[] person = new Person[3];



/*
//定义一个人的类：
class Person{
    //属性：
    public String name;
    public  int age;

    //行为：
    public void eat(){
        System.out.println("吃饭！");
    }
    public void sleep(){
        System.out.println(name+"睡觉！");
    }
}
public class KnowledgeOne {
    public static void main(String[] args) {
        //实例化了一个Person对象（通过关键字new,实例化了一个Person对象）
        Person person1 = new Person();
        Person person2 = new Person();
        Person person3 = new Person();
        //一个类可以实例化多个对象

        person1.name = "张三";//点号（.）是起引用作用
        person1.age = 10;
        person1.sleep();//张三睡觉！
        //如果在给name赋值之前就调用sleep的话，会打印null睡觉
        //（因为name是String类型，而String类型是引用类型，默认值是null）
        //此处不会空指针异常，因为此处只是挂名使用了一下String的默认值null，但是没有通过null来行驶任何权利，比如说引用名字（null.name）啊之类的。
        //就比如：一个盗贼想要抢银行，它瞄准了想抢的银行，但是只是在银行的门口转了一圈，但是没有任何抢银行的实质性的动作

        System.out.println(person1.name+" "+person1.age);//张三 10

        person2.name = "李四";
        person2.age = 12;
        person2.sleep();//李四睡觉！
        System.out.println(person2.name+" "+person2.age);//李四 12

        person3.name = "王五";
        person3.age = 22;
        person3.sleep();//王五睡觉！
        System.out.println(person3.name+" "+person3.age);//王五 22
    }
}
*/



/*
//定义一个人的类：
class Person{
    //属性：
    public String name;
    public  int age;

    //行为：
    public void eat(){
        System.out.println(name+"吃饭！");
    }
    public void sleep(){
        System.out.println(name+"睡觉！");
    }
    public void show(){
        System.out.println("姓名："+name+" 年龄："+age);
    }
}
public class KnowledgeOne {
    public static void main(String[] args) {
        Person person1 = new Person();//引用指向对象（也就是这个引用存储了这个对象的地址）

        //下面的成员变量name和age都没由初始化，但是仍旧不会报错可以直接使用，而同样是没有初始化，局部变量a却报错了
        //因为：对于成员变量，如果没有初始化，编译器会给他们默认值：
        //如果是引用类型，默认为null，
        //int-->0；float、double-->0.0；boolean-->false；char-->'\u0000'

        */
/*System.out.println(person1.name);//null
        System.out.println(person1.age);//0
        int a;
        System.out.println(/a);*//*


        person1.name = "张三";
        System.out.println(person1.name);//张三
        person1.age = 10;
        System.out.println(person1.age);//10
        person1.show();//姓名：张三 年龄：10

        Person person2 = new Person();
        person2.name = "李四";
        System.out.println(person2.name);//李四
        person2.age = 12;
        System.out.println(person2.age);//12
        person2.show();//姓名：李四 年龄：12


        Person person = null;//这代表person不指向任何对象，也无法调用类下面的成员属性和成员方法

        //引用不能指向引用，引用只能指向对象
        person1 = person2;//这代表了person1这个引用指向了person2这个引用所指向的对象
        System.out.println(person1);//Person@1b6d3586
        System.out.println(person2);//Person@1b6d3586

        //一个引用不能同时指向多个对象
        Person person3 = new Person();
        person3 = new Person();
        person3 = new Person();
        person3 = new Person();
        person3 = new Person();
        //尽管new了这么多的Person对象，但是person3只指向了最后一个Person对象
    }
}
*/



/*
class Person{
    //属性：
    public String name;
    public  int age;

    //行为：
    public void eat(){
        System.out.println(name+"吃饭！");
    }
    public void sleep(){
        System.out.println(name+"睡觉！");
    }
    public void show(){
        System.out.println("姓名："+name+" 年龄："+age);
    }

    @Override
    public String toString() {//如果自己实现了，就调用自己的，
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class KnowledgeOne {
    public static void main(String[] args) {
        Person person1 = new Person();

        person1.name = "张三";
        System.out.println(person1.name);//张三
        person1.age = 10;
        System.out.println(person1.age);//10
        person1.show();//姓名：张三 年龄：10

        Person person2 = new Person();
        person2.name = "李四";
        System.out.println(person2.name);//李四
        person2.age = 12;
        System.out.println(person2.age);//12
        person2.show();//姓名：李四 年龄：12

        Person person3 = new Person();
        System.out.println(person3);//Person@1b6d3586
        //Person@1b6d3586
        //Person--->类型的全路径
        //@--->分割
        //1b6d3586--->真实地址的哈希值（近似地理解为路径）

    }
}*/


